#include <stdio.h>
#include <stdbool.h>

// typedef 重命名
// 都是定义一个新的数据类型
typedef enum my_enum
{
    FALSE,
    TRUE,
}BOOL;

typedef struct my_struct_son
{
    int a;
}my_struct_son_t;

// 重命名 struct my_struct_son  ->  my_struct_son_t


typedef void (*func) (int, int);   // 函数指针

typedef int int32_t;
typedef unsigned int uint32_t;
typedef char  int8_t;
typedef unsigned char  uint8_t;


typedef struct my_struct_father
{
    // 成员
    bool    b_param;    // 基本类型
    float   f_param;
    int     i_param;
    char    c_param;
    void (*p_fun) (int, int);   // 函数指针
    int*    p_int;              // 普通指针 （所有类型）
    int     i_array[5];      // 数组
    struct my_struct_son son;   // 其他结构体
    struct my_struct_son*   p_son;  // 结构体指针
    BOOL    B_mybool;       // 自行定义的类型
    my_struct_son_t my_son_sec_param; // 
    my_struct_son_t* p_my_son_sec; // 
    my_struct_son_t my_son_sec_array[5]; // 
}father_t;


// 位域

#if 0
int main()
{
    if(TRUE)
    {
        // 条件成立
    }

    BOOL b_bool;
    b_bool = FALSE;

    return 0;
}
#endif




int main()
{
    struct my_struct_father father;  // 变量
    struct my_struct_father* p_father;  // 指针
    struct my_struct_father a_father[3]; // 数组
    father_t fa_2;
    // 定义变量作用
    /*
    1、在内存里面开辟了一个空间，空间的大小：就是 sizeof(数据类型)
    2、给这个空间重命名为变量名
    */
    father_t*  p_fa = &fa_2;
    // 定义指针
    /*
    1、在内存里面开辟了一个空间,空间的大小是 sizeof(指针名)  
        这个大小是固定的，32位系统，大小是4， 64位系统大小是：8
    指针的作用只是保存一个地址, 指向一个同类型的空间
    */

    fa_2.B_mybool = FALSE;
    fa_2.f_param = 2.35;

    p_fa->f_param = 3.14;  // 赋值

    printf("sum: %.2f\n", fa_2.f_param + p_fa->f_param);

    printf("sizeof:%d\n",sizeof(father_t));
    printf("sizeof int*:%d\n", sizeof(int*));
    printf("sizeof BOOL*:%d\n", sizeof(BOOL));
    printf("sizeof bool:%d\n", sizeof(bool));
    printf("sizeof float:%d\n", sizeof(float));
    printf("sizeof my_struct_son_t:%d\n", sizeof(my_struct_son_t));
    

    func p_func;

    return 0;
}